PIC Tutorial Two - Switches
 Tutorial 2.1 - requires Main Board and Switch Board. 
 ;Tutorial 2.1 - Nigel Goodwin 2002
	LIST	p=16F628		;tell assembler what chip we are using
	include "P16F628.inc"		;include the defaults for the chip
	__config 0x3D18			;sets the configuration settings (oscillator type etc.)
LEDPORT	Equ	PORTA			;set constant LEDPORT = 'PORTA'
SWPORT	Equ	PORTA			;set constant SWPORT = 'PORTA'
LEDTRIS	Equ	TRISA			;set constant for TRIS register
SW1	Equ	7			;set constants for the switches
SW2	Equ	6
SW3	Equ	5
SW4	Equ	4
LED1	Equ	3			;and for the LED's
LED2	Equ	2
LED3	Equ	1
LED4	Equ	0
;end of defines
	
	org	0x0000			;org sets the origin, 0x0000 for the 16F628,
					;this is where the program starts running	
	movlw	0x07
	movwf	CMCON			;turn comparators off (make it like a 16F84)
   	bsf 	STATUS,		RP0	;select bank 1
   	movlw 	b'11110000'		;set PortA 4 inputs, 4 outputs
   	movwf 	LEDTRIS
	bcf	STATUS,		RP0	;select bank 0
	clrf	LEDPORT			;set all outputs low
Loop	btfss	SWPORT,	SW1
	call	Switch1
	btfss	SWPORT,	SW2
	call	Switch2
	btfss	SWPORT,	SW3
	call	Switch3
	btfss	SWPORT,	SW4
	call	Switch4
	goto	Loop
Switch1	clrf	LEDPORT			;turn all LED's off
	bsf	SWPORT,	LED1		;turn LED1 on
	retlw	0x00
Switch2	clrf	LEDPORT			;turn all LED's off
	bsf	SWPORT,	LED2		;turn LED2 on
	retlw	0x00
Switch3	clrf	LEDPORT			;turn all LED's off
	bsf	SWPORT,	LED3		;turn LED3 on
	retlw	0x00
Switch4	clrf	LEDPORT			;turn all LED's off
	bsf	SWPORT,	LED4		;turn LED4 on
	retlw	0x00
	end      
      
      
 Tutorial 2.2 - requires Main Board and Switch Board. 
 ;Tutorial 2.2 - Nigel Goodwin 2002
	LIST	p=16F628		;tell assembler what chip we are using
	include "P16F628.inc"		;include the defaults for the chip
	__config 0x3D18			;sets the configuration settings (oscillator type etc.)
	cblock 	0x20 			;start of general purpose registers
		count1 			;used in delay routine
		counta 			;used in delay routine 
		countb 			;used in delay routine
	endc
LEDPORT	Equ	PORTA			;set constant LEDPORT = 'PORTA'
SWPORT	Equ	PORTA			;set constant SWPORT = 'PORTA'
LEDTRIS	Equ	TRISA			;set constant for TRIS register
SW1	Equ	7			;set constants for the switches
SW2	Equ	6
SW3	Equ	5
SW4	Equ	4
LED1	Equ	3			;and for the LED's
LED2	Equ	2
LED3	Equ	1
LED4	Equ	0
SWDel	Set	Del50			;set the de-bounce delay (has to use 'Set' and not 'Equ')
;end of defines
	
	org	0x0000			;org sets the origin, 0x0000 for the 16F628,
					;this is where the program starts running	
	movlw	0x07
	movwf	CMCON			;turn comparators off (make it like a 16F84)
   	bsf 	STATUS,		RP0	;select bank 1
   	movlw 	b'11110000'		;set PortA 4 inputs, 4 outputs
   	movwf 	LEDTRIS
	bcf	STATUS,		RP0	;select bank 0
	clrf	LEDPORT			;set all outputs low
Loop	btfss	SWPORT,	SW1
	call	Switch1
	btfss	SWPORT,	SW2
	call	Switch2
	btfss	SWPORT,	SW3
	call	Switch3
	btfss	SWPORT,	SW4
	call	Switch4
	goto	Loop
Switch1	call	SWDel			;give switch time to stop bouncing
	btfsc	SWPORT,	SW1		;check it's still pressed
	retlw	0x00			;return is not
	btfss	SWPORT,	LED1		;see if LED1 is already lit
	goto	LED1ON
	goto	LED1OFF
LED1ON	bsf	LEDPORT,	LED1	;turn LED1 on
	call	SWDel
	btfsc	SWPORT,	SW1		;wait until button is released
	retlw	0x00
	goto	LED1ON	
LED1OFF	bcf	LEDPORT,	LED1	;turn LED1 on
	call	SWDel
	btfsc	SWPORT,	SW1		;wait until button is released
	retlw	0x00
	goto	LED1OFF		
Switch2	call	SWDel			;give switch time to stop bouncing
	btfsc	SWPORT,	SW2		;check it's still pressed
	retlw	0x00			;return is not
	btfss	SWPORT,	LED2		;see if LED2 is already lit
	goto	LED2ON
	goto	LED2OFF
LED2ON	bsf	LEDPORT,	LED2	;turn LED2 on
	call	SWDel
	btfsc	SWPORT,	SW2		;wait until button is released
	retlw	0x00
	goto	LED2ON	
LED2OFF	bcf	LEDPORT,	LED2	;turn LED2 on
	call	SWDel
	btfsc	SWPORT,	SW2		;wait until button is released
	retlw	0x00
	goto	LED2OFF
Switch3	call	SWDel			;give switch time to stop bouncing
	btfsc	SWPORT,	SW3		;check it's still pressed
	retlw	0x00			;return is not
	btfss	SWPORT,	LED3		;see if LED3 is already lit
	goto	LED3ON
	goto	LED3OFF
LED3ON	bsf	LEDPORT,	LED3	;turn LED3 on
	call	SWDel
	btfsc	SWPORT,	SW3		;wait until button is released
	retlw	0x00
	goto	LED3ON	
LED3OFF	bcf	LEDPORT,	LED3	;turn LED3 on
	call	SWDel
	btfsc	SWPORT,	SW3		;wait until button is released
	retlw	0x00
	goto	LED3OFF
Switch4	call	SWDel			;give switch time to stop bouncing
	btfsc	SWPORT,	SW4		;check it's still pressed
	retlw	0x00			;return is not
	btfss	SWPORT,	LED4		;see if LED4 is already lit
	goto	LED4ON
	goto	LED4OFF
LED4ON	bsf	LEDPORT,	LED4	;turn LED4 on
	call	SWDel
	btfsc	SWPORT,	SW4		;wait until button is released
	retlw	0x00
	goto	LED4ON	
LED4OFF	bcf	LEDPORT,	LED4	;turn LED4 on
	call	SWDel
	btfsc	SWPORT,	SW4		;wait until button is released
	retlw	0x00
	goto	LED4OFF
;modified Delay routine, direct calls for specified times
;or load W and call Delay for a custom time.
Del0	retlw	0x00			;delay 0mS - return immediately
Del1	movlw	d'1'			;delay 1mS
	goto	Delay
Del5	movlw	d'5'			;delay 5mS
	goto	Delay
Del10	movlw	d'10'			;delay 10mS
	goto	Delay
Del20	movlw	d'20'			;delay 20mS
	goto	Delay
Del50	movlw	d'50'			;delay 50mS
	goto	Delay
Del100	movlw	d'100'			;delay 100mS
	goto	Delay
Del250	movlw	d'250'			;delay 250 ms
Delay	movwf	count1
d1	movlw	0xC7			;delay 1mS
	movwf	counta
	movlw	0x01
	movwf	countb
Delay_0
	decfsz	counta, f
	goto	$+2
	decfsz	countb, f
	goto	Delay_0
	decfsz	count1	,f
	goto	d1
	retlw	0x00
	end      
      
      
 Tutorial 2.3 - requires Main Board, Switch Board, and LED Board. 
 ;Tutorial 2.3 - Nigel Goodwin 2002
	LIST	p=16F628		;tell assembler what chip we are using
	include "P16F628.inc"		;include the defaults for the chip
	__config 0x3D18			;sets the configuration settings (oscillator type etc.)
	cblock 	0x20 			;start of general purpose registers
		count			;used in table read routine
		count1 			;used in delay routine
		counta 			;used in delay routine 
		countb 			;used in delay routine
	endc
LEDPORT	Equ	PORTB			;set constant LEDPORT = 'PORTB'
LEDTRIS	Equ	TRISB			;set constant for TRIS register
SWPORT	Equ	PORTA
SWTRIS	Equ	TRISA
SW1	Equ	7			;set constants for the switches
SW2	Equ	6
SW3	Equ	5
SW4	Equ	4
LED1	Equ	3			;and for the LED's
LED2	Equ	2
LED3	Equ	1
LED4	Equ	0
	
	org	0x0000			;org sets the origin, 0x0000 for the 16F628,
					;this is where the program starts running	
	movlw	0x07
	movwf	CMCON			;turn comparators off (make it like a 16F84)
   	bsf 	STATUS,		RP0	;select bank 1
   	movlw 	b'00000000'		;set PortB all outputs
   	movwf 	LEDTRIS
	movlw 	b'11110000'		;set PortA 4 inputs, 4 outputs
   	movwf 	SWTRIS
	bcf	STATUS,		RP0	;select bank 0
	clrf	LEDPORT			;set all outputs low
	clrf	SWPORT
	bsf	SWPORT,	LED1		;set initial pattern
Start	clrf	count			;set counter register to zero
Read	movf	count, w		;put counter value in W
	btfsc	SWPORT,	LED1		;check which LED is lit
	call	Table1			;and read the associated table
	btfsc	SWPORT,	LED2
	call	Table2
	btfsc	SWPORT,	LED3
	call	Table3
	btfsc	SWPORT,	LED4
	call	Table4
	movwf	LEDPORT
	call	Delay
	incf	count,	w
	xorlw	d'14'			;check for last (14th) entry
	btfsc	STATUS,	Z
	goto	Start			;if start from beginning
	incf	count,	f		;else do next
	goto	Read
Table1	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'10000000'
        retlw   b'01000000'
        retlw   b'00100000'
        retlw   b'00010000'
        retlw   b'00001000'
        retlw   b'00000100'
        retlw   b'00000010'
        retlw   b'00000001'
        retlw   b'00000010'
        retlw   b'00000100'
        retlw   b'00001000'
        retlw   b'00010000'
        retlw   b'00100000'
        retlw   b'01000000'
Table2	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'11000000'
        retlw   b'01100000'
        retlw   b'00110000'
        retlw   b'00011000'
        retlw   b'00001100'
        retlw   b'00000110'
        retlw   b'00000011'
        retlw   b'00000011'
        retlw   b'00000110'
        retlw   b'00001100'
        retlw   b'00011000'
        retlw   b'00110000'
        retlw   b'01100000'
        retlw   b'11000000'
Table3	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'01111111'
        retlw   b'10111111'
        retlw   b'11011111'
        retlw   b'11101111'
        retlw   b'11110111'
        retlw   b'11111011'
        retlw   b'11111101'
        retlw   b'11111110'
        retlw   b'11111101'
        retlw   b'11111011'
        retlw   b'11110111'
        retlw   b'11101111'
        retlw   b'11011111'
        retlw   b'10111111'
Table4	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'00111111'
        retlw   b'10011111'
        retlw   b'11001111'
        retlw   b'11100111'
        retlw   b'11110011'
        retlw   b'11111001'
        retlw   b'11111100'
        retlw   b'11111100'
        retlw   b'11111001'
        retlw   b'11110011'
        retlw   b'11100111'
        retlw   b'11001111'
        retlw   b'10011111'
        retlw   b'00111111'
ChkKeys	btfss	SWPORT,	SW1
	call	Switch1
	btfss	SWPORT,	SW2
	call	Switch2
	btfss	SWPORT,	SW3
	call	Switch3
	btfss	SWPORT,	SW4
	call	Switch4
	retlw	0x00
Switch1	clrf	SWPORT			;turn all LED's off
	bsf	SWPORT,	LED1		;turn LED1 on
	retlw	0x00
Switch2	clrf	SWPORT			;turn all LED's off
	bsf	SWPORT,	LED2		;turn LED2 on
	retlw	0x00
Switch3	clrf	SWPORT			;turn all LED's off
	bsf	SWPORT,	LED3		;turn LED3 on
	retlw	0x00
Switch4	clrf	SWPORT			;turn all LED's off
	bsf	SWPORT,	LED4		;turn LED4 on
	retlw	0x00
Delay	movlw	d'250'			;delay 250 ms (4 MHz clock)
	movwf	count1
d1	call 	ChkKeys 		;check the keys
	movlw	0xC7			;delay 1mS
	movwf	counta
	movlw	0x01
	movwf	countb
Delay_0
	decfsz	counta, f
	goto	$+2
	decfsz	countb, f
	goto	Delay_0
	decfsz	count1	,f
	goto	d1
	retlw	0x00
	end      
      
      
 Tutorial 2.4 - requires Main Board, Switch Board, and LED Board. 
 ;Tutorial 2.4 - Nigel Goodwin 2002
	LIST	p=16F628		;tell assembler what chip we are using
	include "P16F628.inc"		;include the defaults for the chip
	__config 0x3D18			;sets the configuration settings (oscillator type etc.)
	cblock 	0x20 			;start of general purpose registers
		count			;used in table read routine
		count1 			;used in delay routine
		count2 			;used in delay routine
		counta 			;used in delay routine 
		countb
		countc
		countd
		speed
	endc
LEDPORT	Equ	PORTB			;set constant LEDPORT = 'PORTB'
LEDTRIS	Equ	TRISB			;set constant for TRIS register
SWPORT	Equ	PORTA
SWTRIS	Equ	TRISA
SW1	Equ	7			;set constants for the switches
SW2	Equ	6
SW3	Equ	5
SW4	Equ	4
LED1	Equ	3			;and for the LED's
LED2	Equ	2
LED3	Equ	1
LED4	Equ	0
SWDel	Set	Del50
	
	org	0x0000			;org sets the origin, 0x0000 for the 16F628,
					;this is where the program starts running	
	movlw	0x07
	movwf	CMCON			;turn comparators off (make it like a 16F84)
   	bsf 	STATUS,		RP0	;select bank 1
   	movlw 	b'00000000'		;set PortB all outputs
   	movwf 	LEDTRIS
	movlw 	b'11110000'		;set PortA 4 inputs, 4 outputs
   	movwf 	SWTRIS
	bcf	STATUS,		RP0	;select bank 0
	clrf	LEDPORT			;set all outputs low
	clrf	SWPORT			;make sure all LED's are off
	bsf	SWPORT,	LED1		;and turn initial LED on
	movlw	d'250'
	movwf	speed			;set initial speed
Start	clrf	count			;set counter register to zero
Read	movf	count, w		;put counter value in W
	btfsc	SWPORT,	LED1		;check which LED is on
	call	Table1			;and call the associated table
	btfsc	SWPORT,	LED2
	call	Table2
	btfsc	SWPORT,	LED3
	call	Table3
	movwf	LEDPORT
	call	DelVar
	incf	count,	w
	xorlw	d'14'			;check for last (14th) entry
	btfsc	STATUS,	Z
	goto	Start			;if start from beginning
	incf	count,	f		;else do next
	goto	Read
Table1	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'10000000'
        retlw   b'01000000'
        retlw   b'00100000'
        retlw   b'00010000'
        retlw   b'00001000'
        retlw   b'00000100'
        retlw   b'00000010'
        retlw   b'00000001'
        retlw   b'00000010'
        retlw   b'00000100'
        retlw   b'00001000'
        retlw   b'00010000'
        retlw   b'00100000'
        retlw   b'01000000'
Table2	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'11000000'
        retlw   b'01100000'
        retlw   b'00110000'
        retlw   b'00011000'
        retlw   b'00001100'
        retlw   b'00000110'
        retlw   b'00000011'
        retlw   b'00000011'
        retlw   b'00000110'
        retlw   b'00001100'
        retlw   b'00011000'
        retlw   b'00110000'
        retlw   b'01100000'
        retlw   b'11000000'
Table3	ADDWF   PCL, f			;data table for bit pattern
	retlw	b'01111111'
        retlw   b'10111111'
        retlw   b'11011111'
        retlw   b'11101111'
        retlw   b'11110111'
        retlw   b'11111011'
        retlw   b'11111101'
        retlw   b'11111110'
        retlw   b'11111101'
        retlw   b'11111011'
        retlw   b'11110111'
        retlw   b'11101111'
        retlw   b'11011111'
        retlw   b'10111111'
ChkKeys	btfss	SWPORT,	SW1
	call	Switch1
	btfss	SWPORT,	SW2
	call	Switch2
	btfss	SWPORT,	SW3
	call	Switch3
	btfss	SWPORT,	SW4
	call	Switch4
	retlw	0x00
Switch1	bcf	SWPORT,	LED2		;turn unselected LED's off
	bcf	SWPORT,	LED3		;turn unselected LED's off
	bsf	SWPORT,	LED1		;turn LED1 on
	retlw	0x00
Switch2	bcf	SWPORT,	LED1		;turn unselected LED's off
	bcf	SWPORT,	LED3		;turn unselected LED's off
	bsf	SWPORT,	LED2		;turn LED2 on
	retlw	0x00
Switch3	bcf	SWPORT,	LED1		;turn unselected LED's off
	bcf	SWPORT,	LED2		;turn unselected LED's off
	bsf	SWPORT,	LED3		;turn LED3 on
	retlw	0x00
Switch4	call	SWDel			;give switch time to stop bouncing
	btfsc	SWPORT,	SW4		;check it's still pressed
	retlw	0x00			;return is not
	btfss	SWPORT,	LED4		;see if LED4 is already lit
	goto	FASTON
	goto	FASTOFF
FASTON	bsf	SWPORT,	LED4		;turn LED4 on
	movlw	d'80'
	movwf	speed			;set fast speed
	call	SWDel
	btfsc	SWPORT,	SW4		;wait until button is released
	retlw	0x00
	goto	FASTON	
FASTOFF	bcf	SWPORT,	LED4		;turn LED4 on
	movlw	d'250'
	movwf	speed			;set slow speed
	call	SWDel
	btfsc	SWPORT,	SW4		;wait until button is released
	retlw	0x00
	goto	FASTOFF
DelVar	movfw	speed			;delay set by Speed
	movwf	count1
d1	call 	ChkKeys 		;check the keys
	movlw	0xC7			;delay 1mS
	movwf	counta
	movlw	0x01
	movwf	countb
Delay_0
	decfsz	counta, f
	goto	$+2
	decfsz	countb, f
	goto	Delay_0
	decfsz	count1	,f
	goto	d1
	retlw	0x00
;use separate delay routines, as Del50 is called from ChkKeys
;which is called from within DelVar
Del50	movlw	d'50'			;delay 50mS
 	movwf	count2
d3	movlw	0xC7			;delay 1mS
	movwf	countc
	movlw	0x01
	movwf	countd
Delay_1
	decfsz	countc, f
	goto	$+2
	decfsz	countd, f
	goto	Delay_1
	decfsz	count2	,f
	goto	d3
	retlw	0x00
	end       
       
       |